/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package camada.bancodedados.daoimplemente.lancamentos.cartaocredito;

import camada.bancodedados.conexao.Conexao;
import camada.bancodedados.daoimplemente.banco.BancoDAOImpl;
import camada.bancodedados.daoimplemente.contabancaria.ContaBancariaDAOImpl;
import camada.negocio.dao.lancamentos.cartaocredito.LancamentosCartaoCreditoDAO;
import eloma.classe.contabancaria.ContaBancaria;
import eloma.classe.lancamentos.cartaocredito.LancamentosCartaoCredito;
import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Icaro
 */
public class LancamentoCartaoCreditoDAOImpl implements LancamentosCartaoCreditoDAO {

    private static Connection con;
    PreparedStatement stmt = null;
    ResultSet rs = null;

    @Override
    public void inserir(LancamentosCartaoCredito l) throws Exception {

        try {

            con = Conexao.getCon();
            con.setAutoCommit(false);

            //final String SQL_SCRIPT = "insert into lancamento_cartao_credito (idContaBancaria,descricao,dataCompra,valorBruto,parcelas) values (?,?,?,?,?)";
            final String SQL_SCRIPT = "insert into lancamento_cartao_credito "
                    + "(idContaBancaria,dataCompra,mes,ano,descricao,parcela,parcelaQuantidade,valorBruto,valorParcela) "
                    + "select ? as idContaBancaria,? as dataCompra, "
                    + "month(DATE_ADD(?, INTERVAL (30 * a.vezes) DAY)) as mes, "
                    + "year(DATE_ADD(?, INTERVAL (30 * a.vezes) DAY)) as ano, "
                    + "? as descricao, a.vezes as parcela, ? as parcelaQuantidade, ?  as valorBruto  , "
                    + "(? / ?) as valorParcela "
                    + "from vezes a "
                    + "where a.vezes <= ? ";

            stmt = con.prepareStatement(SQL_SCRIPT);
            stmt.setInt(1, l.getContaBancaria().getIdContaBancaria());
            stmt.setDate(2, l.getDataCompra());
            stmt.setDate(3, l.getDataCompra());
            stmt.setDate(4, l.getDataCompra());
            stmt.setString(5, l.getDescricao());
            stmt.setInt(6, l.getParcelas());
            stmt.setDouble(7, l.getValorBruto());
            stmt.setDouble(8, l.getValorBruto());
            stmt.setInt(9, l.getParcelas());
            stmt.setInt(10, l.getParcelas());

            stmt.executeUpdate();

            con.commit();

        } catch (SQLException e) {
            con.rollback();
        } catch (Exception e) {
            con.rollback();
        }
    }

    @Override
    public LancamentosCartaoCredito buscaId(int id) throws Exception {

        try {

            final String SQL_SCRIPT = "select * from lancamento_cartao_credito where idLancamentoCartaoCredito = ?";

            con = Conexao.getCon();
            con.setAutoCommit(false);

            stmt = con.prepareStatement(SQL_SCRIPT);
            stmt.setInt(1, id);
            rs = stmt.executeQuery();

            con.commit();

        } catch (SQLException sqle) {
            con.rollback();
        } catch (Exception e) {
            con.rollback();
        }

        return carregarResultadoSimples(rs);
    }

    @Override
    public void atualizar(LancamentosCartaoCredito l) throws Exception {

        try {

            final String SQL_SCRIPT = "update lancamento_cartao_credito set idContaBancaria = ?, descricao = ?, dataCompra = ?, valorBruto = ?, parcela = ? where idLancamentoCartaoCredito = ?";

            con = Conexao.getCon();
            con.setAutoCommit(false);

            stmt = con.prepareStatement(SQL_SCRIPT);
            stmt.setInt(1, l.getContaBancaria().getIdContaBancaria());
            stmt.setString(2, l.getDescricao());
            stmt.setDate(3, (Date) l.getDataCompra());
            stmt.setDouble(4, l.getValorBruto());
            stmt.setInt(5, l.getParcelas());
            stmt.setInt(6, l.getIdLancamentosCartaoCredito());

            stmt.executeUpdate();

            con.commit();

        } catch (SQLException e) {
            con.rollback();
        } catch (Exception e) {
            con.rollback();
        }
    }

    @Override
    public void remover(LancamentosCartaoCredito l) throws Exception {

        try {

            final String SQL_SCRIPT = "delete from lancamento_cartao_credito where idLancamentoCartaoCredito = ?";

            con = Conexao.getCon();
            con.setAutoCommit(false);

            stmt = con.prepareStatement(SQL_SCRIPT);
            stmt.setInt(1, l.getIdLancamentosCartaoCredito());
            stmt.executeUpdate();

            con.commit();

        } catch (SQLException e) {
            con.rollback();
        } catch (Exception e) {
            con.rollback();
        }

    }

    @Override
    public List<LancamentosCartaoCredito> buscaTodos() throws Exception {

        try {

            String SQL_SCRIPT = "Select * from lancamento_cartao_credito order by idLancamentoCartaoCredito";

            con = Conexao.getCon();
            con.setAutoCommit(false);

            stmt = con.prepareStatement(SQL_SCRIPT);
            rs = stmt.executeQuery();

            con.commit();

        } catch (SQLException sqle) {
            con.rollback();
        } catch (Exception e) {
            con.rollback();
        }

        return carregarMultiplosResultados(rs);

    }

    public List<LancamentosCartaoCredito> carregarMultiplosResultados(ResultSet rs) throws SQLException {
        List<LancamentosCartaoCredito> resultList = new ArrayList<LancamentosCartaoCredito>();
        while (rs.next()) {
            LancamentosCartaoCredito dto = new LancamentosCartaoCredito();
            carregarVO(dto, rs);
            resultList.add(dto);
        }
        return resultList;
    }

    private LancamentosCartaoCredito carregarResultadoSimples(ResultSet rs) throws SQLException {
        if (rs.next()) {
            LancamentosCartaoCredito dto = new LancamentosCartaoCredito();
            carregarVO(dto, rs);
            return dto;
        } else {
            return null;
        }
    }

    private void carregarVO(LancamentosCartaoCredito dto, ResultSet rs) throws SQLException {
        try {

            ContaBancariaDAOImpl daoContaBancaria = new ContaBancariaDAOImpl();

            dto.setIdLancamentosCartaoCredito(rs.getInt("idLancamentoCartaoCredito"));

            ContaBancaria c = daoContaBancaria.buscaBancoId(rs.getInt("idContaBancaria"));
            dto.setContaBancaria(c);

            dto.setDataCompra(rs.getDate("dataCompra"));
            dto.setValorBruto(rs.getDouble("valorBruto"));
            dto.setParcelas(rs.getInt("parcela"));

        } catch (Exception e) {

        }
    }

}
